package com.zhilei.controller;

import com.zhilei.config.MinIOConfig;
import com.zhilei.grace.result.GraceJSONResult;
import com.zhilei.grace.result.ResponseStatusEnum;
import com.zhilei.pojo.bo.Base64FileBO;
import com.zhilei.service.AsyncFileService;
import com.zhilei.untils.Base64ToFile;
import com.zhilei.utils.MinIOUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.UUID;

/**
 * @author 志磊
 * @serial 2024-09-19
 */
@RestController
@RequestMapping("file")
@Slf4j
public class FileController {

    public static final String HOST = "http://192.168.77.1:8000/";

    @Autowired
    private MinIOConfig minIOConfig;
    @Autowired
    private AsyncFileService asyncFileService;

    /**
     * 封装上传文件的方法
     *
     * @param file
     * @param userId
     * @return
     */
    private static File getFilePath(MultipartFile file, String userId) {
        String originalFilename = file.getOriginalFilename();

        String suffixName = null;
        // TODO 截取文件的后缀名
        if (originalFilename != null) {
            // TODO 这样截取不会包含.
            suffixName = originalFilename.substring(originalFilename.lastIndexOf("."));
        }

        // TODO 生成一个新的文件名
        String newFileName = userId + suffixName;

        // TODO 上传头像到本地磁盘
        String fileName = "D:" + File.separator + "temp" + File.separator + newFileName;

        // TODO 判断文件路径是否存在
        File filePath = new File(fileName);
        return filePath;
    }

    /**
     * 本地上传图片
     *
     * @param file
     * @param userId
     * @return
     */
    @PostMapping(value = "uploadFace1")
    public GraceJSONResult uploadFace(@RequestParam("file") MultipartFile file,
                                      @RequestParam("userId") String userId) {

        // TODO 上传头像到本地
        // TODO 获得文件的原始名称
        File filePath = getFilePath(file, userId);
        if (!filePath.getParentFile().exists()) {
            // TODO 如果不存在，创建父目录
            filePath.getParentFile().mkdirs();
        }

        try {
            // TODO 上传头像到本地
            file.transferTo(filePath);
        } catch (Exception e) {
            log.error("上传头像到本地失败", e);
            return GraceJSONResult.errorMsg("上传头像到本地失败");
        }

        // TODO 拼接图片上传的路径
        String faceUrl = HOST + "upload/temp/" + filePath.getName();
        log.info("上传头像URL: {}", faceUrl);

        // TODO 封装返回结果
        return GraceJSONResult.ok(faceUrl);
    }

    /**
     * 使用minio进行上传
     *
     * @param file
     * @param userId
     * @return
     */
    @PostMapping(value = "uploadFace")
    public GraceJSONResult uploadFaceByMinio(@RequestParam("file") MultipartFile file,
                                             @RequestParam("userId") String userId) {

        // TODO 校验用户id是否存在
        if (StringUtils.isBlank(userId)) {
            return GraceJSONResult.exception(ResponseStatusEnum.FILE_UPLOAD_FAILD);
        }

        // TODO 获取文件名
        String fileName = file.getOriginalFilename();

        // TODO 对文件名进行拼接
        fileName = userId + "/" + fileName;

        String imageUrl = "";
        // TODO 使用minio进行上传
        try {
            // TODO 返回图片上传的路径
            imageUrl = MinIOUtils.uploadFile(minIOConfig.getBucketName(), fileName, file.getInputStream(), true);
            log.info("上传头像URL: {}", imageUrl);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return GraceJSONResult.exception(ResponseStatusEnum.FILE_UPLOAD_FAILD);
        }

        // TODO 封装返回结果
        return GraceJSONResult.ok(imageUrl);
    }

    /**
     * 修admin头像
     *
     * @param base64FileBO
     * @return
     */
    @PostMapping(value = "uploadAdminFace")
    public GraceJSONResult uploadAdminFace(@RequestBody Base64FileBO base64FileBO) {

        // TODO 获取用户上传的图片
        String base64File = base64FileBO.getBase64File();

        // TODO 获取当前日期并格式化为 yyyy-MM-dd 格式
        String dateFolder = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));

        String suffixName = ".png"; // 后缀
        String uuid = UUID.randomUUID().toString(); // 文件名
        String objectName = dateFolder + "/" + uuid + suffixName;   // 对象名

        // TODO 图片存放的路径
        String localDir = "E:/temp/adminFace/" + dateFolder;
        String filePath = localDir + "/" + uuid + suffixName;

        try {
            // TODO 确保目录存在
            Files.createDirectories(Paths.get(localDir));

            // TODO 转化base64字符串到本地图片
            Base64ToFile.Base64ToFile(base64File, filePath);
            // TODO 上传到minio
            MinIOUtils.uploadFile(minIOConfig.getBucketName(), objectName, filePath);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            GraceJSONResult.exception(ResponseStatusEnum.FILE_UPLOAD_FAILD);
        }

        // TODO 拼接图片上传的路径
        String imageUrl = minIOConfig.getFileHost()
                + "/"
                + minIOConfig.getBucketName()
                + "/"
                + objectName;

        // TODO 异步删除本地图片
        asyncFileService.deleteFileAsync("E:/temp/adminFace/");

        // TODO 封装返回结果
        return GraceJSONResult.ok(imageUrl);
    }

    /**
     * 上传公司的LOGO
     *
     * @param file
     * @return
     */
    @PostMapping(value = "uploadLogo")
    public GraceJSONResult uploadLogo(@RequestParam("file") MultipartFile file) {

        // TODO 获取文件名
        String fileName = file.getOriginalFilename();

        // TODO 截取文件的后缀名
        String suffixName = fileName.substring(fileName.lastIndexOf("."));

        // TODO 获取当前日期并格式化为 yyyy-MM-dd 格式
        String dateFolder = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));

        String uuid = UUID.randomUUID().toString();

        fileName = dateFolder + "/logo/" + uuid + suffixName;

        String imageUrl;
        // TODO 使用minio进行上传
        try {
            // TODO 返回图片上传的路径
            imageUrl = MinIOUtils.uploadFile(minIOConfig.getBucketName(), fileName, file.getInputStream(), true);
            log.info("上传头像URL: {}", imageUrl);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return GraceJSONResult.exception(ResponseStatusEnum.FILE_UPLOAD_FAILD);
        }

        // TODO 封装返回结果
        return GraceJSONResult.ok(imageUrl);
    }

    /**
     * 上传营业执照
     *
     * @param file
     * @return
     */
    @PostMapping(value = "uploadBizLicense")
    public GraceJSONResult uploadBizLicense(@RequestParam("file") MultipartFile file) {

        // TODO 获取文件名
        String fileName = file.getOriginalFilename();

        // TODO 截取文件的后缀名
        String suffixName = null;
        if (StringUtils.isNotBlank(fileName)) {
            suffixName = fileName.substring(fileName.lastIndexOf("."));
        }

        // TODO 获取当前日期并格式化为 yyyy-MM-dd 格式
        String dateFolder = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));

        String uuid = UUID.randomUUID().toString();

        fileName = dateFolder + "/bizLicense/" + uuid + suffixName;

        String imageUrl;
        // TODO 使用minio进行上传
        try {
            // TODO 返回图片上传的路径
            imageUrl = MinIOUtils.uploadFile(minIOConfig.getBucketName(), fileName, file.getInputStream(), true);
            log.info("上传头像URL: {}", imageUrl);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return GraceJSONResult.exception(ResponseStatusEnum.FILE_UPLOAD_FAILD);
        }

        // TODO 封装返回结果
        return GraceJSONResult.ok(imageUrl);
    }

    /**
     * 上传图片
     *
     * @param file
     * @return
     */
    @PostMapping(value = "uploadAuthLetter")
    public GraceJSONResult uploadAuthLetter(@RequestParam("file") MultipartFile file) {

        // TODO 获取文件名
        String fileName = file.getOriginalFilename();

        // TODO 截取文件的后缀名
        String suffixName = null;
        if (StringUtils.isNotBlank(fileName)) {
            suffixName = fileName.substring(fileName.lastIndexOf("."));
        }

        // TODO 获取当前日期并格式化为 yyyy-MM-dd 格式
        String dateFolder = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));

        String uuid = UUID.randomUUID().toString();

        fileName = dateFolder + "/company/authLetter/" + uuid + suffixName;

        String imageUrl;
        // TODO 使用minio进行上传
        try {
            // TODO 返回图片上传的路径
            imageUrl = MinIOUtils.uploadFile(minIOConfig.getBucketName(), fileName, file.getInputStream(), true);
            log.info("上传头像URL: {}", imageUrl);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            return GraceJSONResult.exception(ResponseStatusEnum.FILE_UPLOAD_FAILD);
        }

        // TODO 封装返回结果
        return GraceJSONResult.ok(imageUrl);
    }

    /**
     * 根据企业id上传照片
     *
     * @param files
     * @param companyId
     * @return
     */
    @PostMapping(value = "uploadPhoto")
    public GraceJSONResult uploadPhoto(@RequestParam("files") MultipartFile[] files,
                                       @RequestParam("companyId") String companyId) {

        ArrayList<String> imageUrlList = new ArrayList<>();
        // TODO 获取文件名
        for (MultipartFile multipartFile : files) {
            String fileName = multipartFile.getOriginalFilename();

            // TODO 截取文件的后缀名
            String suffixName = null;
            if (StringUtils.isNotBlank(fileName)) {
                suffixName = fileName.substring(fileName.lastIndexOf("."));
            }

            // TODO 获取当前日期并格式化为 yyyy-MM-dd 格式
            String dateFolder = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));

            String uuid = UUID.randomUUID().toString();

            fileName = dateFolder + "/company/uploadPhoto/" + uuid + companyId + suffixName;

            String imageUrl;
            // TODO 使用minio进行上传
            try {
                // TODO 返回图片上传的路径
                imageUrl = MinIOUtils.uploadFile(minIOConfig.getBucketName(), fileName, multipartFile.getInputStream(), true);
                log.info("上传头像URL: {}", imageUrl);
            } catch (Exception e) {
                System.out.println(e.getMessage());
                return GraceJSONResult.exception(ResponseStatusEnum.FILE_UPLOAD_FAILD);
            }
            imageUrlList.add(imageUrl);
        }

        return GraceJSONResult.ok(imageUrlList);
    }

}
































